from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from routers import register_router
from plugin.plugin_sqlalchemy import register_database
from middleware.middleware import add_process_time_header, set_logger
from contextlib import asynccontextmanager
from plugin import get_redis_pool
from plugin.plugin_scheduler import init_scheduler, stop_scheduler
from utils.logger import logger
from config import setting

@asynccontextmanager
async def lifespan(app: FastAPI):
    logger.info("服务已启动,监听端口:{}".format(setting.APP_PORT))
    # 注册路由
    register_router(app)
    # 注册数据库
    register_database()
    # 注册redis
    session = await get_redis_pool()
    app.state.redis = session
    init_scheduler()
    logger.info("Application running on http://{}:{} (Press CTRL+C to quit)".format(setting.APP_HOST, setting.APP_PORT))
    yield
    await session.close()
    stop_scheduler()
    logger.info("服务已停止运行...")



# 创建app应用
def create_app():
    app = FastAPI(lifespan=lifespan)
    # 定义中间件功能
    app.middleware("http")(add_process_time_header)
    app.middleware("http")(set_logger)
    # 处理跨域请求
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],  # 允许的来源，可以是字符串、字符串列表，或通配符 "*"
        allow_credentials=True,  # 是否允许携带凭证（例如，使用 HTTP 认证、Cookie 等）
        allow_methods=["*"],  # 允许的 HTTP 方法，可以是字符串、字符串列表，或通配符 "*"
        allow_headers=["*"],  # 允许的 HTTP 头信息，可以是字符串、字符串列表，或通配符 "*"
        expose_headers=["*"],  # 允许前端访问的额外响应头，可以是字符串、字符串列表
        max_age=600,  # 请求的缓存时间，以秒为单位
    )
    return app